package Garagem.Persistencia;

/**
 *
 * @author pablo
 */

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;


public abstract class BaseDAO<T> {

    public void remove(int id) {
        Connection c = Conexao.novaConexao();

        try {
            String SQL = "DELETE FROM " + tabela() + " WHERE id_" + tabela() + " = ?";
            
            PreparedStatement cmd = c.prepareStatement(SQL);

            cmd.setInt(1, id);

            cmd.executeUpdate();

        } catch (Exception e) {
            Logger.getLogger(BaseDAO.class.getName()).log(Level.SEVERE, null, e);
            throw new BancoDadosException("Não foi possível remover o(s) " + tabela(), e);
        } 
    }
    
     public T findById(int id) {
         T obj = null;
        Connection c = Conexao.novaConexao();
        try {
            String SQL = "SELECT * FROM "+tabela()+" WHERE id_ " + tabela() + " = ?";

            PreparedStatement cmd = c.prepareStatement(SQL);

            cmd.setInt(1, id);
            
            //JOptionPane.showMessageDialog(null, cmd);

            ResultSet rows = cmd.executeQuery();
            
            while (rows.next()) {
                obj = preenche(rows);
            }

        } catch (SQLException e) {
            Logger.getLogger(BaseDAO.class.getName()).log(Level.SEVERE, null, e);
            throw new BancoDadosException("Não foi possível inserir o(s) " +tabela(), e);
        }
        return obj;
    }

   
    
  public List<T> findAll() {
        List<T> obj = new ArrayList<T>();
        Connection c = Conexao.novaConexao();
        try {
           PreparedStatement cmd = c.prepareStatement("SELECT * FROM " +tabela());
            ResultSet rows = cmd.executeQuery();

            while (rows.next()) {
                System.out.println("Entrou no while");
                
                obj.add(preenche(rows));
                
                System.out.println(obj);
            }

        } catch (SQLException e) {
            Logger.getLogger(BaseDAO.class.getName()).log(Level.SEVERE, null, e);
            throw new BancoDadosException("Não foi possível buscar o(s) " +tabela(), e);
        } 
        return obj;
    }

  
  public List<T> ListaDescricao() {
        List<T> obj = new ArrayList<T>();
        Connection c = Conexao.novaConexao();
        try {
           PreparedStatement cmd = c.prepareStatement("SELECT descricao FROM " +tabela());
            ResultSet rows = cmd.executeQuery();

            while (rows.next()) {
                obj.add(preenche(rows));
            }
            JOptionPane.showMessageDialog(null, obj);

        } catch (SQLException e) {
            Logger.getLogger(BaseDAO.class.getName()).log(Level.SEVERE, null, e);
            throw new BancoDadosException("Não foi possível buscar o(s) " +tabela(), e);
        } 

        return obj;
    }

  
    public abstract T preenche(ResultSet rows);

    public abstract String tabela();
    
}

